#include<iostream>
#include<cstring>
#include<cstdlib>

using ElementType=void*;
/*
设计一个 Student 类，包含以下功能：
1. 属性：
姓名（ string ）
学号（ int ）
三门课程的成绩（ int 数组）
2. 方法：
构造函数：初始化姓名、学号和成绩。
double average() ：计算并返回三门课程的平均分。
void display() ：显示学生的所有信息及平均分。
扩展要求：
创建一个 student 数组 来管理多个学生的信息，完成录入和查询功能*/

class student
{
private:
    int m_id;
    int m_score[3];
    char m_name[20];
public:
    student(){}
    student(int id, int* score, const char* name);
    double average();
    void display();
    friend class Management;
};

student::student(int id, int* score, const char *name)
{
    m_id=id;
    strcpy(m_name,name);
    for(int i=0; i<3; i++)
    {
        m_score[i]=score[i];
    }
}

double student::average()
{
    return 1.00*(m_score[0]+m_score[1]+m_score[2])/3;
}

void student::display()
{
    std::cout<<"姓名:"<<m_name<<"\n"<<"学号:"<<m_id<<"\n"<<"三门课程分数:";
    for(int i=0;i<3;i++)
    std::cout<<m_score[i]<<"   ";
    std::cout<<"平均分为:"<<average()<<std::endl;
}

class Management
{
private:
    student *Stu;
    int m_capacity;
    int m_size;

public:
    Management();
    void addStu(const student& s);
    void show();
    void Find(int id);
    ~Management();
};

Management::Management():m_capacity(10),m_size(0)
{
    Stu= new student[m_capacity];
}

void Management::addStu(const student& s)
{
    if(m_size>=m_capacity)
    {
        m_capacity *=2;
        student *newP= new student[m_capacity];
        for(int i=0; i< m_size; i++)
        {
            newP[i]=Stu[i];
        }
        delete []Stu;
        Stu= newP;
    }
    Stu[m_size++]= s;
}

void Management::Find(int id)
{
    for(int i=0; i<m_size; i++)
    {
        if(Stu[i].m_id==id)
        Stu[i].display();
    }
}

Management::~Management()
{
    delete []Stu;
}

void Management::show()
{
    for(int i=0; i<m_size; i++)
    {
       Stu[i].display();
    }
}

int main()
{
    Management m;
    int a[3]={12,32,13};
    int b[3]={77,99,88};
    int c[3]={66,52,85};
    student wang(1,a,"wang");
    student liu(2,b,"liu");
    student zhao(3,c,"zhao");
    m.addStu(wang);
    m.addStu(liu);
    m.addStu(zhao);
    int Ops=0;
        do{
        std::cout<<"请输入你要进行的操作"<<std::endl;
        std::cout<<"1、输入\n2、查找\n3、显示全部\n0、退出"<<std::endl;
        std::cin>>Ops;
                if(Ops==0) break;
        switch (Ops)
        {
        case 1:{
            int id=0;
            int score[3]={0};
            char name[20];
            std::cout<<"请输入你要添加的学号"<<std::endl;
            std::cin>>id;
            std::cout<<"请输入你要添加的学员名字"<<std::endl;
            std::cin>>name;
            std::cout<<"请输入你要添加的成绩"<<std::endl;
            for(int i=0; i<3; i++)
            std::cin>>score[i];
            student s(id,score,name);
            m.addStu(s);
            break;
        }

        case 2:{
            int id=0;
            std::cout<<"请输入你要查找的人员学号"<<std::endl;
            std::cin>>id;
            m.Find(id);
            break;
        }

        case 3:{
            m.show();
            break;
        }
        default:{std::cout<<"输入错误，请重新输入"<<std::endl; break;};
        }
        }while (Ops>=0);
    return 0;
}
